home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / optdlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-03-20  |  36.6 KB  |  1,100 lines

  1. //    VirtualDub - Video processing and capture application
  2. //    Copyright (C) 1998-2001 Avery Lee
  3. //
  4. //    This program is free software; you can redistribute it and/or modify
  5. //    it under the terms of the GNU General Public License as published by
  6. //    the Free Software Foundation; either version 2 of the License, or
  7. //    (at your option) any later version.
  8. //
  9. //    This program is distributed in the hope that it will be useful,
  10. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. //    GNU General Public License for more details.
  13. //
  14. //    You should have received a copy of the GNU General Public License
  15. //    along with this program; if not, write to the Free Software
  16. //    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. #include <stdio.h>
  19. #include <math.h>
  20.  
  21. #include <windows.h>
  22. #include <commctrl.h>
  23.  
  24. #define OPTDLG_STATICS
  25. #include "optdlg.h"
  26.  
  27. #include "resource.h"
  28. #include "helpfile.h"
  29. #include "oshelper.h"
  30. #include "misc.h"
  31. #include "gui.h"
  32.  
  33. #include "AudioSource.h"
  34. #include "VideoSource.h"
  35. #include "Dub.h"
  36.  
  37. extern char g_msgBuf[];
  38. extern HINSTANCE g_hInst;
  39.  
  40. extern AudioSource *inputAudio;
  41. extern VideoSource *inputVideoAVI;
  42.  
  43. extern void SetAudioSource();
  44.  
  45. ///////////////////////////////////////////
  46.  
  47. void ActivateDubDialog(HINSTANCE hInst, LPCTSTR lpResource, HWND hDlg, DLGPROC dlgProc) {
  48.     DubOptions duh;
  49.  
  50.     duh = g_dubOpts;
  51.     if (DialogBoxParam(hInst, lpResource, hDlg, dlgProc, (LPARAM)&duh))
  52.         g_dubOpts = duh;
  53. }
  54.  
  55. ///////////////////////////////////////////
  56.  
  57. static void AudioConversionDlgComputeBandwidth(HWND hDlg) {
  58.     long bps=0;
  59.  
  60.     if (     IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_NOCHANGE))    bps = inputAudio ? inputAudio->getWaveFormat()->nSamplesPerSec : 0;
  61.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_11KHZ))        bps = 11025;
  62.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_22KHZ))        bps = 22050;
  63.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_44KHZ))        bps = 44100;
  64.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_8KHZ))        bps = 8000;
  65.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_16KHZ))        bps = 16000;
  66.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_48KHZ))        bps = 48000;
  67.     else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_CUSTOM))
  68.         bps = GetDlgItemInt(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL, NULL, FALSE);
  69.  
  70.     if (     IsDlgButtonChecked(hDlg, IDC_PRECISION_NOCHANGE))    bps *= inputAudio ? inputAudio->getWaveFormat()->wBitsPerSample>8 ? 2 : 1 : 1;
  71.     else if (IsDlgButtonChecked(hDlg, IDC_PRECISION_16BIT))        bps *= 2;
  72.  
  73.     if (     IsDlgButtonChecked(hDlg, IDC_CHANNELS_NOCHANGE))    bps *= inputAudio ? inputAudio->getWaveFormat()->nChannels>1 ? 2 : 1 : 1;
  74.     else if (IsDlgButtonChecked(hDlg, IDC_CHANNELS_STEREO))        bps *= 2;
  75.  
  76.     if (bps)
  77.         wsprintf(g_msgBuf, "Bandwidth required: %ldK/s", (bps+1023)>>10);
  78.     else
  79.         strcpy(g_msgBuf,"Bandwidth required: (unknown)");
  80.     SetDlgItemText(hDlg, IDC_BANDWIDTH_REQD, g_msgBuf);
  81. }
  82.  
  83. DWORD dwAudioConversionHelpLookup[]={
  84.     IDC_SAMPLINGRATE_NOCHANGE,        IDH_AUDCONV_SAMPLINGRATE,
  85.     IDC_SAMPLINGRATE_11KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  86.     IDC_SAMPLINGRATE_22KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  87.     IDC_SAMPLINGRATE_44KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  88.     IDC_SAMPLINGRATE_8KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  89.     IDC_SAMPLINGRATE_16KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  90.     IDC_SAMPLINGRATE_48KHZ,            IDH_AUDCONV_SAMPLINGRATE,
  91.     IDC_SAMPLINGRATE_CUSTOM,        IDH_AUDCONV_SAMPLINGRATE,
  92.     IDC_SAMPLINGRATE_CUSTOM_VAL,    IDH_AUDCONV_SAMPLINGRATE,
  93.     IDC_SAMPLINGRATE_INTEGRAL,        IDH_AUDCONV_INTEGRALCONVERSION,
  94.     IDC_SAMPLINGRATE_HQ,            IDH_AUDCONV_HIGHQUALITY,
  95.     IDC_PRECISION_NOCHANGE,            IDH_AUDCONV_PRECISION,
  96.     IDC_PRECISION_8BIT,                IDH_AUDCONV_PRECISION,
  97.     IDC_PRECISION_16BIT,            IDH_AUDCONV_PRECISION,
  98.     IDC_CHANNELS_NOCHANGE,            IDH_AUDCONV_CHANNELS,
  99.     IDC_CHANNELS_MONO,                IDH_AUDCONV_CHANNELS,
  100.     IDC_CHANNELS_STEREO,            IDH_AUDCONV_CHANNELS,
  101.     IDC_BANDWIDTH_REQD,                IDH_AUDCONV_BANDWIDTHREQUIRED,
  102.     NULL
  103. };
  104.  
  105. BOOL APIENTRY AudioConversionDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  106. {
  107.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  108.  
  109.     switch (message)
  110.     {
  111.         case WM_INITDIALOG:
  112.             SetWindowLong(hDlg, DWL_USER, lParam);
  113.             dopt = (DubOptions *)lParam;
  114.  
  115.             SetAudioSource();
  116.             if (inputAudio) {
  117.                 wsprintf(g_msgBuf, "No change (%ldHz)", inputAudio->getWaveFormat()->nSamplesPerSec);
  118.                 SetDlgItemText(hDlg, IDC_SAMPLINGRATE_NOCHANGE, g_msgBuf);
  119.                 wsprintf(g_msgBuf, "No change (%ld-bit)", inputAudio->getWaveFormat()->wBitsPerSample>8 ? 16 : 8);
  120.                 SetDlgItemText(hDlg, IDC_PRECISION_NOCHANGE, g_msgBuf);
  121.                 wsprintf(g_msgBuf, "No change (%s)", inputAudio->getWaveFormat()->nChannels>1 ? "stereo" : "mono");
  122.                 SetDlgItemText(hDlg, IDC_CHANNELS_NOCHANGE, g_msgBuf);
  123.             }
  124.  
  125.             switch(dopt->audio.new_rate) {
  126.             case 0:        CheckDlgButton(hDlg, IDC_SAMPLINGRATE_NOCHANGE, TRUE); break;
  127.             case 8000:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_8KHZ, TRUE);    break;
  128.             case 11025:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_11KHZ, TRUE);    break;
  129.             case 16000:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_16KHZ, TRUE);    break;
  130.             case 22050:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_22KHZ, TRUE);    break;
  131.             case 44100:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_44KHZ, TRUE);    break;
  132.             case 48000:    CheckDlgButton(hDlg, IDC_SAMPLINGRATE_48KHZ, TRUE);    break;
  133.             default:
  134.                 CheckDlgButton(hDlg, IDC_SAMPLINGRATE_CUSTOM, TRUE);
  135.                 EnableWindow(GetDlgItem(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL), TRUE);
  136.                 SetDlgItemInt(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL, dopt->audio.new_rate, FALSE);
  137.                 break;
  138.             }
  139.             CheckDlgButton(hDlg, IDC_SAMPLINGRATE_INTEGRAL, !!dopt->audio.integral_rate);
  140.             CheckDlgButton(hDlg, IDC_SAMPLINGRATE_HQ, !!dopt->audio.fHighQuality);
  141.             CheckDlgButton(hDlg, IDC_PRECISION_NOCHANGE+dopt->audio.newPrecision,TRUE);
  142.             CheckDlgButton(hDlg, IDC_CHANNELS_NOCHANGE+dopt->audio.newChannels,TRUE);
  143.  
  144.             AudioConversionDlgComputeBandwidth(hDlg);
  145.  
  146.             return (TRUE);
  147.  
  148.         case WM_COMMAND:
  149.             switch(LOWORD(wParam)) {
  150.             case IDC_SAMPLINGRATE_NOCHANGE:
  151.             case IDC_SAMPLINGRATE_8KHZ:
  152.             case IDC_SAMPLINGRATE_11KHZ:
  153.             case IDC_SAMPLINGRATE_16KHZ:
  154.             case IDC_SAMPLINGRATE_22KHZ:
  155.             case IDC_SAMPLINGRATE_44KHZ:
  156.             case IDC_SAMPLINGRATE_48KHZ:
  157.                 if (!IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_CUSTOM))
  158.                     EnableWindow(GetDlgItem(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL), FALSE);
  159.             case IDC_PRECISION_NOCHANGE:
  160.             case IDC_PRECISION_8BIT:
  161.             case IDC_PRECISION_16BIT:
  162.             case IDC_CHANNELS_NOCHANGE:
  163.             case IDC_CHANNELS_MONO:
  164.             case IDC_CHANNELS_STEREO:
  165.             case IDC_CHANNELS_LEFT:
  166.             case IDC_CHANNELS_RIGHT:
  167.             case IDC_SAMPLINGRATE_CUSTOM_VAL:
  168.                 AudioConversionDlgComputeBandwidth(hDlg);
  169.                 break;
  170.  
  171.             case IDC_SAMPLINGRATE_CUSTOM:
  172.                 EnableWindow(GetDlgItem(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL), TRUE);
  173.                 AudioConversionDlgComputeBandwidth(hDlg);
  174.                 break;
  175.  
  176.             case IDOK:
  177.                 if      (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_NOCHANGE)) dopt->audio.new_rate = 0;
  178.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_8KHZ   )) dopt->audio.new_rate = 8000;
  179.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_11KHZ   )) dopt->audio.new_rate = 11025;
  180.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_16KHZ   )) dopt->audio.new_rate = 16000;
  181.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_22KHZ   )) dopt->audio.new_rate = 22050;
  182.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_44KHZ   )) dopt->audio.new_rate = 44100;
  183.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_48KHZ   )) dopt->audio.new_rate = 48000;
  184.                 else if (IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_CUSTOM))
  185.                     dopt->audio.new_rate = GetDlgItemInt(hDlg, IDC_SAMPLINGRATE_CUSTOM_VAL, NULL, FALSE);
  186.  
  187.                 if        (IsDlgButtonChecked(hDlg, IDC_PRECISION_NOCHANGE)) dopt->audio.newPrecision = DubAudioOptions::P_NOCHANGE;
  188.                 else if    (IsDlgButtonChecked(hDlg, IDC_PRECISION_8BIT    )) dopt->audio.newPrecision = DubAudioOptions::P_8BIT;
  189.                 else if    (IsDlgButtonChecked(hDlg, IDC_PRECISION_16BIT   )) dopt->audio.newPrecision = DubAudioOptions::P_16BIT;
  190.  
  191.                 if        (IsDlgButtonChecked(hDlg, IDC_CHANNELS_NOCHANGE)) dopt->audio.newChannels = DubAudioOptions::C_NOCHANGE;
  192.                 else if    (IsDlgButtonChecked(hDlg, IDC_CHANNELS_MONO    )) dopt->audio.newChannels = DubAudioOptions::C_MONO;
  193.                 else if    (IsDlgButtonChecked(hDlg, IDC_CHANNELS_STEREO  )) dopt->audio.newChannels = DubAudioOptions::C_STEREO;
  194.                 else if    (IsDlgButtonChecked(hDlg, IDC_CHANNELS_LEFT    )) dopt->audio.newChannels = DubAudioOptions::C_MONOLEFT;
  195.                 else if    (IsDlgButtonChecked(hDlg, IDC_CHANNELS_RIGHT   )) dopt->audio.newChannels = DubAudioOptions::C_MONORIGHT;
  196.  
  197.                 dopt->audio.integral_rate = !!IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_INTEGRAL);
  198.                 dopt->audio.fHighQuality = !!IsDlgButtonChecked(hDlg, IDC_SAMPLINGRATE_HQ);
  199.  
  200.                 EndDialog(hDlg, TRUE);
  201.                 return TRUE;
  202.             case IDCANCEL:
  203.                 EndDialog(hDlg, FALSE);
  204.                 return TRUE;
  205.             }
  206.             break;
  207.  
  208.         case WM_HELP:
  209.             {
  210.                 HELPINFO *lphi = (HELPINFO *)lParam;
  211.  
  212.                 if (lphi->iContextType == HELPINFO_WINDOW)
  213.                     HelpPopupByID(hDlg, lphi->iCtrlId, dwAudioConversionHelpLookup);
  214.             }
  215.             return TRUE;
  216.     }
  217.     return FALSE;
  218. }
  219.  
  220. ///////////////////////////////////////////
  221.  
  222. void AudioInterleaveDlgEnableStuff(HWND hDlg, BOOL en) {
  223.     EnableWindow(GetDlgItem(hDlg, IDC_PRELOAD), en);
  224.     EnableWindow(GetDlgItem(hDlg, IDC_INTERVAL), en);
  225.     EnableWindow(GetDlgItem(hDlg, IDC_FRAMES), en);
  226.     EnableWindow(GetDlgItem(hDlg, IDC_MS), en);
  227. }
  228.  
  229. BOOL APIENTRY AudioInterleaveDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  230. {
  231.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  232.  
  233.     switch (message)
  234.     {
  235.         case WM_INITDIALOG:
  236.             SetWindowLong(hDlg, DWL_USER, lParam);
  237.             dopt = (DubOptions *)lParam;
  238.  
  239.             CheckDlgButton(hDlg, IDC_INTERLEAVE, dopt->audio.enabled);
  240.             AudioInterleaveDlgEnableStuff(hDlg, dopt->audio.enabled);
  241. //            if (dopt->audio.enabled) {
  242.                 SetDlgItemInt(hDlg, IDC_PRELOAD, dopt->audio.preload, FALSE);
  243.                 SetDlgItemInt(hDlg, IDC_INTERVAL, dopt->audio.interval, FALSE);
  244.                 CheckDlgButton(hDlg, IDC_FRAMES, !dopt->audio.is_ms);
  245.                 CheckDlgButton(hDlg, IDC_MS, dopt->audio.is_ms);
  246. //            }
  247.             SetDlgItemInt(hDlg, IDC_DISPLACEMENT, dopt->audio.offset, TRUE);
  248.             return (TRUE);
  249.  
  250.         case WM_COMMAND:
  251.             switch(LOWORD(wParam)) {
  252.             case IDC_INTERLEAVE:
  253.                 AudioInterleaveDlgEnableStuff(hDlg, IsDlgButtonChecked(hDlg, IDC_INTERLEAVE));
  254.                 break;
  255.  
  256.             case IDOK:
  257.                 dopt->audio.enabled = !!IsDlgButtonChecked(hDlg, IDC_INTERLEAVE);
  258.  
  259.                 if (dopt->audio.enabled) {
  260.                     dopt->audio.preload = GetDlgItemInt(hDlg, IDC_PRELOAD, NULL, TRUE);
  261.                     if (dopt->audio.preload<0 || dopt->audio.preload>60000) {
  262.                         SetFocus(GetDlgItem(hDlg, IDC_PRELOAD));
  263.                         MessageBeep(MB_ICONQUESTION);
  264.                         break;
  265.                     }
  266.  
  267.                     dopt->audio.interval = GetDlgItemInt(hDlg, IDC_INTERVAL, NULL, TRUE);
  268.                     if (dopt->audio.interval<0 || dopt->audio.interval>3600000) {
  269.                         SetFocus(GetDlgItem(hDlg, IDC_INTERVAL));
  270.                         MessageBeep(MB_ICONQUESTION);
  271.                         break;
  272.                     }
  273.  
  274.                     dopt->audio.is_ms = !!IsDlgButtonChecked(hDlg, IDC_MS);
  275.                 }
  276.  
  277.                 dopt->audio.offset = GetDlgItemInt(hDlg, IDC_DISPLACEMENT, NULL, TRUE);
  278.  
  279.                 EndDialog(hDlg, TRUE);
  280.                 return TRUE;
  281.             case IDCANCEL:
  282.                 EndDialog(hDlg, FALSE);
  283.                 return TRUE;
  284.             }
  285.             break;
  286.     }
  287.     return FALSE;
  288. }
  289.  
  290. /////////////////////////////////
  291.  
  292. static DWORD dwVideoDepthHelpLookup[]={
  293.     IDC_INPUT_16BIT,            IDH_DLG_VDEPTH_INPUT,
  294.     IDC_INPUT_24BIT,            IDH_DLG_VDEPTH_INPUT,
  295.     IDC_OUTPUT_16BIT,            IDH_DLG_VDEPTH_OUTPUT,
  296.     IDC_OUTPUT_24BIT,            IDH_DLG_VDEPTH_OUTPUT,
  297.     IDC_OUTPUT_32BIT,            IDH_DLG_VDEPTH_OUTPUT,
  298.     0,0
  299. };
  300.  
  301. BOOL APIENTRY VideoDepthDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  302. {
  303.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  304.  
  305.     switch (message)
  306.     {
  307.         case WM_INITDIALOG:
  308.             SetWindowLong(hDlg, DWL_USER, lParam);
  309.             dopt = (DubOptions *)lParam;
  310.  
  311.             CheckDlgButton(hDlg, IDC_INPUT_16BIT, dopt->video.inputDepth == DubVideoOptions::D_16BIT);
  312.             CheckDlgButton(hDlg, IDC_INPUT_24BIT, dopt->video.inputDepth != DubVideoOptions::D_16BIT);
  313.             CheckDlgButton(hDlg, IDC_OUTPUT_16BIT, dopt->video.outputDepth == DubVideoOptions::D_16BIT);
  314.             CheckDlgButton(hDlg, IDC_OUTPUT_24BIT, dopt->video.outputDepth == DubVideoOptions::D_24BIT);
  315.             CheckDlgButton(hDlg, IDC_OUTPUT_32BIT, dopt->video.outputDepth == DubVideoOptions::D_32BIT);
  316.             return (TRUE);
  317.  
  318.         case WM_HELP:
  319.             {
  320.                 HELPINFO *lphi = (HELPINFO *)lParam;
  321.  
  322.                 if (lphi->iContextType == HELPINFO_WINDOW)
  323.                     HelpPopupByID(hDlg, lphi->iCtrlId, dwVideoDepthHelpLookup);
  324.             }
  325.             return TRUE;
  326.  
  327.         case WM_COMMAND:
  328.             switch(LOWORD(wParam)) {
  329.             case IDOK:
  330.                 dopt->video.inputDepth = IsDlgButtonChecked(hDlg, IDC_INPUT_24BIT) ? DubVideoOptions::D_24BIT : DubVideoOptions::D_16BIT;
  331.  
  332.                 if (IsDlgButtonChecked(hDlg, IDC_OUTPUT_16BIT)) dopt->video.outputDepth = DubVideoOptions::D_16BIT;
  333.                 if (IsDlgButtonChecked(hDlg, IDC_OUTPUT_24BIT)) dopt->video.outputDepth = DubVideoOptions::D_24BIT;
  334.                 if (IsDlgButtonChecked(hDlg, IDC_OUTPUT_32BIT)) dopt->video.outputDepth = DubVideoOptions::D_32BIT;
  335.                 
  336.                 EndDialog(hDlg, TRUE);
  337.                 return TRUE;
  338.             case IDCANCEL:
  339.                 EndDialog(hDlg, FALSE);
  340.                 return TRUE;
  341.             }
  342.             break;
  343.     }
  344.     return FALSE;
  345. }
  346.  
  347. ///////////////////////////////////////////////////////////////////////////
  348. //
  349. //    Performance dialog
  350. //
  351. ///////////////////////////////////////////////////////////////////////////
  352.  
  353. static long outputBufferSizeArray[]={
  354.     128*1024,
  355.     192*1024,
  356.     256*1024,
  357.     512*1024,
  358.     768*1024,
  359.     1*1024*1024,
  360.     2*1024*1024,
  361.     3*1024*1024,
  362.     4*1024*1024,
  363.     6*1024*1024,
  364.     8*1024*1024,
  365.     12*1024*1024,
  366.     16*1024*1024,
  367.     20*1024*1024,
  368.     24*1024*1024,
  369.     32*1024*1024,
  370.     48*1024*1024,
  371.     64*1024*1024,
  372. };
  373.  
  374. static long waveBufferSizeArray[]={
  375.     8*1024,
  376.     12*1024,
  377.     16*1024,
  378.     24*1024,
  379.     32*1024,
  380.     48*1024,
  381.     64*1024,
  382.     96*1024,
  383.     128*1024,
  384.     192*1024,
  385.     256*1024,
  386.     384*1024,
  387.     512*1024,
  388.     768*1024,
  389.     1024*1024,
  390.     1536*1024,
  391.     2048*1024,
  392.     3*1024*1024,
  393.     4*1024*1024,
  394.     6*1024*1024,
  395.     8*1024*1024
  396. };
  397.  
  398. static long pipeBufferCountArray[]={
  399.     4,
  400.     6,
  401.     8,
  402.     12,
  403.     16,
  404.     24,
  405.     32,
  406.     48,
  407.     64,
  408.     96,
  409.     128,
  410.     192,
  411.     256,
  412. };
  413.  
  414. #define ELEMENTS(x) (sizeof (x)/sizeof(x)[0])
  415.  
  416. BOOL APIENTRY PerformanceOptionsDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  417. {
  418.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  419.     LONG pos;
  420.     HWND hWndItem;
  421.  
  422.     switch (message)
  423.     {
  424.         case WM_INITDIALOG:
  425.             SetWindowLong(hDlg, DWL_USER, lParam);
  426.             dopt = (DubOptions *)lParam;
  427.  
  428.             hWndItem = GetDlgItem(hDlg, IDC_OUTPUT_BUFFER);
  429.             SendMessage(hWndItem, TBM_SETRANGE, FALSE, MAKELONG(0,sizeof outputBufferSizeArray / sizeof outputBufferSizeArray[0] - 1));
  430.             SendMessage(hWndItem, TBM_SETPOS, TRUE, NearestLongValue(dopt->perf.outputBufferSize, outputBufferSizeArray, ELEMENTS(outputBufferSizeArray)));
  431.             SendMessage(hDlg, WM_HSCROLL, 0, (LPARAM)hWndItem);
  432.             hWndItem = GetDlgItem(hDlg, IDC_WAVE_INPUT_BUFFER);
  433.             SendMessage(hWndItem, TBM_SETRANGE, FALSE, MAKELONG(0,sizeof waveBufferSizeArray / sizeof waveBufferSizeArray[0] - 1));
  434.             SendMessage(hWndItem, TBM_SETPOS, TRUE, NearestLongValue(dopt->perf.waveBufferSize, waveBufferSizeArray, ELEMENTS(waveBufferSizeArray)));
  435.             SendMessage(hDlg, WM_HSCROLL, 0, (LPARAM)hWndItem);
  436.             hWndItem = GetDlgItem(hDlg, IDC_PIPE_BUFFERS);
  437.             SendMessage(hWndItem, TBM_SETRANGE, FALSE, MAKELONG(0,sizeof pipeBufferCountArray / sizeof pipeBufferCountArray[0] - 1));
  438.             SendMessage(hWndItem, TBM_SETPOS, TRUE, NearestLongValue(dopt->perf.pipeBufferCount, pipeBufferCountArray, ELEMENTS(pipeBufferCountArray)));
  439.             SendMessage(hDlg, WM_HSCROLL, 0, (LPARAM)hWndItem);
  440.             return (TRUE);
  441.  
  442.         case WM_HSCROLL:
  443.  
  444.             pos = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
  445.  
  446.             switch(GetWindowLong((HWND)lParam, GWL_ID)) {
  447.             case IDC_OUTPUT_BUFFER:
  448.                 if (pos >= 5)
  449.                     wsprintf(g_msgBuf, "VirtualDub will use %ldMb of memory for output buffering.",outputBufferSizeArray[pos]>>20);
  450.                 else
  451.                     wsprintf(g_msgBuf, "VirtualDub will use %ldk of memory for output buffering.",outputBufferSizeArray[pos]>>10);
  452.  
  453.                 SetDlgItemText(hDlg, IDC_OUTPUT_BUFFER_SIZE, g_msgBuf);
  454.                 return TRUE;
  455.  
  456.             case IDC_WAVE_INPUT_BUFFER:
  457.                 if (pos >= 14)
  458.                     wsprintf(g_msgBuf, "Replacement WAV audio tracks will use %ldMb of memory for input buffering.",waveBufferSizeArray[pos]>>20);
  459.                 else
  460.                     wsprintf(g_msgBuf, "Replacement WAV audio tracks will use %ldk of memory for input buffering.",waveBufferSizeArray[pos]>>10);
  461.  
  462.                 SetDlgItemText(hDlg, IDC_WAVE_BUFFER_SIZE, g_msgBuf);
  463.                 return TRUE;
  464.  
  465.             case IDC_PIPE_BUFFERS:
  466.                 wsprintf(g_msgBuf, "Pipelining will be limited to %ld buffers.\n", pipeBufferCountArray[pos]);
  467.                 SetDlgItemText(hDlg, IDC_STATIC_PIPE_BUFFERS, g_msgBuf);
  468.                 return TRUE;
  469.             }
  470.             break;
  471.  
  472.         case WM_COMMAND:
  473.             switch(LOWORD(wParam)) {
  474.             case IDOK:
  475.                 {
  476.                     long index;
  477.  
  478.                     index = SendMessage(GetDlgItem(hDlg, IDC_OUTPUT_BUFFER), TBM_GETPOS, 0, 0);
  479.                     dopt->perf.outputBufferSize = outputBufferSizeArray[index];
  480.  
  481.                     index = SendMessage(GetDlgItem(hDlg, IDC_WAVE_INPUT_BUFFER), TBM_GETPOS, 0, 0);
  482.                     dopt->perf.waveBufferSize = waveBufferSizeArray[index];
  483.  
  484.                     index = SendMessage(GetDlgItem(hDlg, IDC_PIPE_BUFFERS), TBM_GETPOS, 0, 0);
  485.                     dopt->perf.pipeBufferCount = pipeBufferCountArray[index];
  486.                 }
  487.                 EndDialog(hDlg, TRUE);
  488.                 return TRUE;
  489.             case IDCANCEL:
  490.                 EndDialog(hDlg, FALSE);
  491.                 return TRUE;
  492.             }
  493.             break;
  494.     }
  495.     return FALSE;
  496. }
  497.  
  498. BOOL APIENTRY DynamicCompileOptionsDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  499. {
  500.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  501.  
  502.     switch (message)
  503.     {
  504.         case WM_INITDIALOG:
  505.             SetWindowLong(hDlg, DWL_USER, lParam);
  506.             dopt = (DubOptions *)lParam;
  507.  
  508.             CheckDlgButton(hDlg, IDC_ENABLE, dopt->perf.dynamicEnable);
  509.             CheckDlgButton(hDlg, IDC_DISPLAY_CODE, dopt->perf.dynamicShowDisassembly);
  510.  
  511.             return (TRUE);
  512.  
  513.         case WM_COMMAND:
  514.             switch(LOWORD(wParam)) {
  515.             case IDOK:
  516.                 dopt->perf.dynamicEnable = !!IsDlgButtonChecked(hDlg, IDC_ENABLE);
  517.                 dopt->perf.dynamicShowDisassembly = !!IsDlgButtonChecked(hDlg, IDC_DISPLAY_CODE);
  518.                 EndDialog(hDlg, TRUE);
  519.                 return TRUE;
  520.             case IDCANCEL:
  521.                 EndDialog(hDlg, FALSE);
  522.                 return TRUE;
  523.             }
  524.             break;
  525.     }
  526.     return FALSE;
  527. }
  528.  
  529. //////////////////////////////////////////////
  530.  
  531. static DWORD dwVideoFramerateHelpLookup[]={
  532.     IDC_DECIMATE_1,            IDH_DLG_VFR_DECIMATION,
  533.     IDC_DECIMATE_2,            IDH_DLG_VFR_DECIMATION,
  534.     IDC_DECIMATE_3,            IDH_DLG_VFR_DECIMATION,
  535.     IDC_DECIMATE_N,            IDH_DLG_VFR_DECIMATION,
  536.     IDC_DECIMATE_VALUE,        IDH_DLG_VFR_DECIMATION,
  537.     IDC_FRAMERATE,            IDH_DLG_VFR_FRAMERATE,
  538.     IDC_FRAMERATE_CHANGE,    IDH_DLG_VFR_FRAMERATE,
  539.     IDC_FRAMERATE_NOCHANGE,    IDH_DLG_VFR_FRAMERATE,
  540.     0,0
  541. };
  542.  
  543. static void VideoDecimationRedoIVTCEnables(HWND hDlg) {
  544.     bool f3, f4;
  545.     BOOL e;
  546.  
  547.     f3 = !!IsDlgButtonChecked(hDlg, IDC_IVTC_RECONFIELDSFIXED);
  548.     f4 = !!IsDlgButtonChecked(hDlg, IDC_IVTC_RECONFRAMESMANUAL);
  549.  
  550.     e = f3 || f4;
  551.  
  552.     EnableWindow(GetDlgItem(hDlg, IDC_STATIC_IVTCOFFSET), e);
  553.     EnableWindow(GetDlgItem(hDlg, IDC_IVTCOFFSET), e);
  554.     EnableWindow(GetDlgItem(hDlg, IDC_INVPOLARITY), e);
  555. }
  556.  
  557. BOOL APIENTRY VideoDecimationDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  558. {
  559.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  560.  
  561.     switch (message)
  562.     {
  563.         case WM_INITDIALOG:
  564.             SetWindowLong(hDlg, DWL_USER, lParam);
  565.             dopt = (DubOptions *)lParam;
  566.  
  567.             SetAudioSource();
  568.  
  569.             CheckDlgButton(hDlg, IDC_INVTELECINE, dopt->video.fInvTelecine);
  570.  
  571.             if (dopt->video.fInvTelecine) {
  572.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_1), FALSE);
  573.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_2), FALSE);
  574.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_3), FALSE);
  575.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_N), FALSE);
  576.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_VALUE), FALSE);
  577.             }
  578.  
  579.             CheckDlgButton(hDlg, IDC_DECIMATE_1, dopt->video.frameRateDecimation==1);
  580.             CheckDlgButton(hDlg, IDC_DECIMATE_2, dopt->video.frameRateDecimation==2);
  581.             CheckDlgButton(hDlg, IDC_DECIMATE_3, dopt->video.frameRateDecimation==3);
  582.             CheckDlgButton(hDlg, IDC_DECIMATE_N, dopt->video.frameRateDecimation>3);
  583.             if (dopt->video.frameRateDecimation>3)
  584.                 SetDlgItemInt(hDlg, IDC_DECIMATE_VALUE, dopt->video.frameRateDecimation, FALSE);
  585.             else
  586.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_VALUE), FALSE);
  587.  
  588.             if (inputVideoAVI) {
  589.                 sprintf(g_msgBuf, "No change (current: %.3f fps)", (double)inputVideoAVI->streamInfo.dwRate / inputVideoAVI->streamInfo.dwScale);
  590.                 SetDlgItemText(hDlg, IDC_FRAMERATE_NOCHANGE, g_msgBuf);
  591.  
  592.                 if (inputAudio && inputAudio->streamInfo.dwLength) {
  593.                     sprintf(g_msgBuf, "(%.3f fps)", (inputVideoAVI->streamInfo.dwLength*1000.0) / inputAudio->samplesToMs(inputAudio->streamInfo.dwLength));
  594.                     SetDlgItemText(hDlg, IDC_FRAMERATE_SAMELENGTH_VALUE, g_msgBuf);
  595.                 } else
  596.                     EnableWindow(GetDlgItem(hDlg, IDC_FRAMERATE_SAMELENGTH), FALSE);
  597.             }
  598.  
  599.             if (dopt->video.frameRateNewMicroSecs == DubVideoOptions::FR_SAMELENGTH) {
  600.                 if (!inputAudio)
  601.                     CheckDlgButton(hDlg, IDC_FRAMERATE_NOCHANGE, TRUE);
  602.                 else
  603.                     CheckDlgButton(hDlg, IDC_FRAMERATE_SAMELENGTH, TRUE);
  604.                 EnableWindow(GetDlgItem(hDlg, IDC_FRAMERATE), FALSE);
  605.             } else if (dopt->video.frameRateNewMicroSecs) {
  606.                 sprintf(g_msgBuf, "%.3f", 1000000.0/dopt->video.frameRateNewMicroSecs);
  607.                 SetDlgItemText(hDlg, IDC_FRAMERATE, g_msgBuf);
  608.                 CheckDlgButton(hDlg, IDC_FRAMERATE_CHANGE, TRUE);
  609.             } else {
  610.                 CheckDlgButton(hDlg, IDC_FRAMERATE_NOCHANGE, TRUE);
  611.                 EnableWindow(GetDlgItem(hDlg, IDC_FRAMERATE), FALSE);
  612.             }
  613.  
  614.             if (dopt->video.fInvTelecine) {
  615.                 if (dopt->video.fIVTCMode)
  616.                     CheckDlgButton(hDlg, IDC_IVTC_RECONFRAMESMANUAL, TRUE);
  617.                 else if (dopt->video.nIVTCOffset<0)
  618.                     CheckDlgButton(hDlg, IDC_IVTC_RECONFIELDS, TRUE);
  619.                 else
  620.                     CheckDlgButton(hDlg, IDC_IVTC_RECONFIELDSFIXED, TRUE);
  621.             } else
  622.                 CheckDlgButton(hDlg, IDC_IVTC_OFF, TRUE);
  623.  
  624.             SetDlgItemInt(hDlg, IDC_IVTCOFFSET, dopt->video.nIVTCOffset<0 ? 1 : dopt->video.nIVTCOffset, FALSE);
  625.             CheckDlgButton(hDlg, IDC_INVPOLARITY, dopt->video.fIVTCPolarity);
  626.  
  627.             VideoDecimationRedoIVTCEnables(hDlg);
  628.  
  629.             return (TRUE);
  630.  
  631.         case WM_HELP:
  632.             {
  633.                 HELPINFO *lphi = (HELPINFO *)lParam;
  634.  
  635.                 if (lphi->iContextType == HELPINFO_WINDOW)
  636.                     HelpPopupByID(hDlg, lphi->iCtrlId, dwVideoFramerateHelpLookup);
  637.             }
  638.             return TRUE;
  639.  
  640.         case WM_COMMAND:
  641.             switch(LOWORD(wParam)) {
  642.             case IDC_DECIMATE_1:
  643.             case IDC_DECIMATE_2:
  644.             case IDC_DECIMATE_3:
  645.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_VALUE), FALSE);
  646.                 break;
  647.             case IDC_DECIMATE_N:
  648.                 EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_VALUE), TRUE);
  649.                 SetFocus(GetDlgItem(hDlg, IDC_DECIMATE_VALUE));
  650.                 break;
  651.  
  652.             case IDC_FRAMERATE_CHANGE:
  653.                 if (SendMessage((HWND)lParam, BM_GETSTATE, 0, 0) & BST_CHECKED)
  654.                     EnableWindow(GetDlgItem(hDlg, IDC_FRAMERATE),TRUE);
  655.                 break;
  656.  
  657.             case IDC_FRAMERATE_SAMELENGTH:
  658.             case IDC_FRAMERATE_NOCHANGE:
  659.                 if (SendMessage((HWND)lParam, BM_GETSTATE, 0, 0) & BST_CHECKED)
  660.                     EnableWindow(GetDlgItem(hDlg, IDC_FRAMERATE),FALSE);
  661.                 break;
  662.  
  663.             case IDC_IVTC_OFF:
  664.             case IDC_IVTC_RECONFIELDS:
  665.             case IDC_IVTC_RECONFIELDSFIXED:
  666.             case IDC_IVTC_RECONFRAMESMANUAL:
  667.                 {
  668.                     BOOL f = IsDlgButtonChecked(hDlg, IDC_IVTC_OFF);
  669.  
  670.                     EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_1), f);
  671.                     EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_2), f);
  672.                     EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_3), f);
  673.                     EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_N), f);
  674.                     EnableWindow(GetDlgItem(hDlg, IDC_DECIMATE_VALUE), f && IsDlgButtonChecked(hDlg, IDC_DECIMATE_N));
  675.                     VideoDecimationRedoIVTCEnables(hDlg);
  676.                 }
  677.                 break;
  678.  
  679.             case IDOK:
  680.                 {
  681.                     int newFRD;
  682.  
  683.                     if (IsDlgButtonChecked(hDlg, IDC_DECIMATE_N)) {
  684.                         LONG lv = GetDlgItemInt(hDlg, IDC_DECIMATE_VALUE, NULL, TRUE);
  685.  
  686.                         if (lv<1) {
  687.                             SetFocus(GetDlgItem(hDlg, IDC_DECIMATE_VALUE));
  688.                             MessageBeep(MB_ICONQUESTION);
  689.                             return FALSE;
  690.                         }
  691.  
  692.                         newFRD = lv;
  693.                     } else if (IsDlgButtonChecked(hDlg, IDC_DECIMATE_1))
  694.                         newFRD = 1;
  695.                     else if (IsDlgButtonChecked(hDlg, IDC_DECIMATE_2))
  696.                         newFRD = 2;
  697.                     else if (IsDlgButtonChecked(hDlg, IDC_DECIMATE_3))
  698.                         newFRD = 3;
  699.  
  700.                     if (IsDlgButtonChecked(hDlg, IDC_FRAMERATE_CHANGE)) {
  701.                         double newFR;
  702.  
  703.                         GetDlgItemText(hDlg, IDC_FRAMERATE, g_msgBuf, 64);
  704.                         newFR = atof(g_msgBuf);
  705.  
  706.                         if (newFR<=0.0 || newFR>=200.0) {
  707.                             SetFocus(GetDlgItem(hDlg, IDC_FRAMERATE));
  708.                             MessageBeep(MB_ICONQUESTION);
  709.                             return FALSE;
  710.                         }
  711.  
  712.                         dopt->video.frameRateNewMicroSecs = (long)(1000000.0/newFR + .5);
  713.                     } else if (IsDlgButtonChecked(hDlg, IDC_FRAMERATE_SAMELENGTH)) {
  714.                         dopt->video.frameRateNewMicroSecs = DubVideoOptions::FR_SAMELENGTH;
  715.                     } else dopt->video.frameRateNewMicroSecs = 0;
  716.  
  717.                     dopt->video.frameRateDecimation = newFRD;
  718.  
  719.                     if (IsDlgButtonChecked(hDlg, IDC_IVTC_RECONFIELDS)) {
  720.                         dopt->video.fInvTelecine = true;
  721.                         dopt->video.fIVTCMode = false;
  722.                         dopt->video.nIVTCOffset = -1;
  723.                         dopt->video.frameRateDecimation = 1;
  724.                     } else if (IsDlgButtonChecked(hDlg, IDC_IVTC_RECONFIELDSFIXED)) {
  725.                         BOOL fSuccess;
  726.                         LONG lv = GetDlgItemInt(hDlg, IDC_IVTCOFFSET, &fSuccess, FALSE);
  727.  
  728.                         dopt->video.fInvTelecine = true;
  729.                         dopt->video.fIVTCMode = false;
  730.                         dopt->video.nIVTCOffset = lv % 5;
  731.                         dopt->video.fIVTCPolarity = !!IsDlgButtonChecked(hDlg, IDC_INVPOLARITY);
  732.                         dopt->video.frameRateDecimation = 1;
  733.                     } else if (IsDlgButtonChecked(hDlg, IDC_IVTC_RECONFRAMESMANUAL)) {
  734.                         BOOL fSuccess;
  735.                         LONG lv = GetDlgItemInt(hDlg, IDC_IVTCOFFSET, &fSuccess, FALSE);
  736.  
  737.                         dopt->video.fInvTelecine = true;
  738.                         dopt->video.fIVTCMode = true;
  739.                         dopt->video.nIVTCOffset = lv % 5;
  740.                         dopt->video.fIVTCPolarity = !!IsDlgButtonChecked(hDlg, IDC_INVPOLARITY);
  741.                         dopt->video.frameRateDecimation = 1;
  742.                     } else {
  743.                         dopt->video.fInvTelecine = false;
  744.                     }
  745.                 }
  746.  
  747.                 EndDialog(hDlg, TRUE);
  748.                 return TRUE;
  749.             case IDCANCEL:
  750.                 EndDialog(hDlg, FALSE);
  751.                 return TRUE;
  752.             }
  753.             break;
  754.     }
  755.     return FALSE;
  756. }
  757.  
  758. ///////////////////////////////////////////
  759.  
  760. static BOOL videoClippingDlgEditReentry=FALSE;
  761.  
  762. static void VideoClippingDlgMSToFrames(HWND hDlg, UINT idFrames, UINT idMS) {
  763.     LONG lv,lFrames;
  764.     BOOL ok;
  765.  
  766.     if (!inputVideoAVI) return;
  767.  
  768.     lv = GetDlgItemInt(hDlg, idMS, &ok, FALSE);
  769.     if (!ok) return;
  770.     videoClippingDlgEditReentry = TRUE;
  771.     SetDlgItemInt(hDlg, idFrames, lFrames=inputVideoAVI->msToSamples(lv), FALSE);
  772.     SetDlgItemInt(hDlg, IDC_LENGTH_MS,
  773.                 inputVideoAVI->samplesToMs(inputVideoAVI->lSampleLast - inputVideoAVI->lSampleFirst)
  774.                 -GetDlgItemInt(hDlg, IDC_END_MS, NULL, FALSE)
  775.                 -GetDlgItemInt(hDlg, IDC_START_MS, NULL, FALSE), TRUE);
  776.     SetDlgItemInt(hDlg, IDC_LENGTH_FRAMES,
  777.                 inputVideoAVI->lSampleLast - inputVideoAVI->lSampleFirst
  778.                 -GetDlgItemInt(hDlg, IDC_END_FRAMES, NULL, FALSE)
  779.                 -GetDlgItemInt(hDlg, IDC_START_FRAMES, NULL, FALSE), TRUE);
  780.     videoClippingDlgEditReentry = FALSE;
  781. }
  782.  
  783. static void VideoClippingDlgFramesToMS(HWND hDlg, UINT idMS, UINT idFrames) {
  784.     LONG lv, lMS;
  785.     BOOL ok;
  786.  
  787.     if (!inputVideoAVI) return;
  788.  
  789.     lv = GetDlgItemInt(hDlg, idFrames, &ok, FALSE);
  790.     if (!ok) return;
  791.     videoClippingDlgEditReentry = TRUE;
  792.     SetDlgItemInt(hDlg, idMS, lMS = inputVideoAVI->samplesToMs(lv), FALSE);
  793.     SetDlgItemInt(hDlg, IDC_LENGTH_MS,
  794.                 inputVideoAVI->samplesToMs(inputVideoAVI->lSampleLast - inputVideoAVI->lSampleFirst)
  795.                 -GetDlgItemInt(hDlg, IDC_END_MS, NULL, FALSE)
  796.                 -GetDlgItemInt(hDlg, IDC_START_MS, NULL, FALSE), TRUE);
  797.     SetDlgItemInt(hDlg, IDC_LENGTH_FRAMES,
  798.                 inputVideoAVI->streamInfo.dwLength
  799.                 -GetDlgItemInt(hDlg, IDC_END_FRAMES, NULL, FALSE)
  800.                 -GetDlgItemInt(hDlg, IDC_START_FRAMES, NULL, FALSE), TRUE);
  801.     videoClippingDlgEditReentry = FALSE;
  802. }
  803.  
  804. static void VideoClippingDlgLengthFrames(HWND hDlg) {
  805.     LONG lv, lMS;
  806.     BOOL ok;
  807.  
  808.     if (!inputVideoAVI) return;
  809.  
  810.     lv = GetDlgItemInt(hDlg, IDC_LENGTH_FRAMES, &ok, TRUE);
  811.     if (!ok) return;
  812.     videoClippingDlgEditReentry = TRUE;
  813.     SetDlgItemInt(hDlg, IDC_LENGTH_MS, lMS = inputVideoAVI->samplesToMs(lv), FALSE);
  814.     SetDlgItemInt(hDlg, IDC_END_MS,
  815.                 inputVideoAVI->samplesToMs(inputVideoAVI->streamInfo.dwLength)
  816.                 -lMS
  817.                 -GetDlgItemInt(hDlg, IDC_START_MS, NULL, TRUE), TRUE);
  818.     SetDlgItemInt(hDlg, IDC_END_FRAMES,
  819.                 inputVideoAVI->streamInfo.dwLength
  820.                 -lv
  821.                 -GetDlgItemInt(hDlg, IDC_START_FRAMES, NULL, TRUE), TRUE);
  822.     videoClippingDlgEditReentry = FALSE;
  823. }
  824.  
  825. static void VideoClippingDlgLengthMS(HWND hDlg) {
  826.     LONG lv,lFrames;
  827.     BOOL ok;
  828.  
  829.     if (!inputVideoAVI) return;
  830.  
  831.     lv = GetDlgItemInt(hDlg, IDC_LENGTH_MS, &ok, TRUE);
  832.     if (!ok) return;
  833.     videoClippingDlgEditReentry = TRUE;
  834.     SetDlgItemInt(hDlg, IDC_LENGTH_FRAMES, lFrames=inputVideoAVI->msToSamples(lv), FALSE);
  835.     SetDlgItemInt(hDlg, IDC_END_MS,
  836.                 inputVideoAVI->samplesToMs(inputVideoAVI->streamInfo.dwLength)
  837.                 -lv
  838.                 -GetDlgItemInt(hDlg, IDC_START_MS, NULL, TRUE), TRUE);
  839.     SetDlgItemInt(hDlg, IDC_END_FRAMES,
  840.                 inputVideoAVI->streamInfo.dwLength
  841.                 -lFrames
  842.                 -GetDlgItemInt(hDlg, IDC_START_FRAMES, NULL, TRUE), TRUE);
  843.     videoClippingDlgEditReentry = FALSE;
  844. }
  845.  
  846. static DWORD dwVideoClippingHelpLookup[]={
  847.     IDC_START_MS,                IDH_DLG_VCLIP_RANGES,
  848.     IDC_LENGTH_MS,                IDH_DLG_VCLIP_RANGES,
  849.     IDC_END_MS,                    IDH_DLG_VCLIP_RANGES,
  850.     IDC_START_FRAMES,            IDH_DLG_VCLIP_RANGES,
  851.     IDC_LENGTH_FRAMES,            IDH_DLG_VCLIP_RANGES,
  852.     IDC_END_FRAMES,                IDH_DLG_VCLIP_RANGES,
  853.     IDC_OFFSET_AUDIO,            IDH_DLG_VCLIP_OFFSETAUDIO,
  854.     IDC_CLIP_AUDIO,                IDH_DLG_VCLIP_CLIPAUDIO,
  855.     0,0
  856. };
  857.  
  858. BOOL APIENTRY VideoClippingDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  859. {
  860.     DubOptions *dopt = (DubOptions *)GetWindowLong(hDlg, DWL_USER);
  861.  
  862.     switch (message)
  863.     {
  864.         case WM_INITDIALOG:
  865.             SetWindowLong(hDlg, DWL_USER, lParam);
  866.             dopt = (DubOptions *)lParam;
  867.  
  868.             EnableWindow(GetDlgItem(hDlg, IDC_LENGTH_MS), !!inputVideoAVI);
  869.             EnableWindow(GetDlgItem(hDlg, IDC_START_FRAMES), !!inputVideoAVI);
  870.             EnableWindow(GetDlgItem(hDlg, IDC_LENGTH_FRAMES), !!inputVideoAVI);
  871.             EnableWindow(GetDlgItem(hDlg, IDC_END_FRAMES), !!inputVideoAVI);
  872.             SetDlgItemInt(hDlg, IDC_START_MS, dopt->video.lStartOffsetMS, FALSE);
  873.             SetDlgItemInt(hDlg, IDC_END_MS, dopt->video.lEndOffsetMS, FALSE);
  874.             CheckDlgButton(hDlg, IDC_OFFSET_AUDIO, dopt->audio.fStartAudio);
  875.             CheckDlgButton(hDlg, IDC_CLIP_AUDIO, dopt->audio.fEndAudio);
  876.             return (TRUE);
  877.  
  878.         case WM_HELP:
  879.             {
  880.                 HELPINFO *lphi = (HELPINFO *)lParam;
  881.  
  882.                 if (lphi->iContextType == HELPINFO_WINDOW)
  883.                     HelpPopupByID(hDlg, lphi->iCtrlId, dwVideoClippingHelpLookup);
  884.             }
  885.             return TRUE;
  886.  
  887.         case WM_COMMAND:
  888.             switch(LOWORD(wParam)) {
  889.             case IDC_START_MS:
  890.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  891.                     VideoClippingDlgMSToFrames(hDlg, IDC_START_FRAMES, IDC_START_MS);
  892.                 break;
  893.             case IDC_START_FRAMES:
  894.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  895.                     VideoClippingDlgFramesToMS(hDlg, IDC_START_MS, IDC_START_FRAMES);
  896.                 break;
  897.             case IDC_END_MS:
  898.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  899.                     VideoClippingDlgMSToFrames(hDlg, IDC_END_FRAMES, IDC_END_MS);
  900.                 break;
  901.             case IDC_END_FRAMES:
  902.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  903.                     VideoClippingDlgFramesToMS(hDlg, IDC_END_MS, IDC_END_FRAMES);
  904.                 break;
  905.             case IDC_LENGTH_MS:
  906.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  907.                     VideoClippingDlgLengthMS(hDlg);
  908.                 break;
  909.             case IDC_LENGTH_FRAMES:
  910.                 if (HIWORD(wParam)==EN_CHANGE && !videoClippingDlgEditReentry)
  911.                     VideoClippingDlgLengthFrames(hDlg);
  912.                 break;
  913.             case IDOK:
  914.                 dopt->video.lStartOffsetMS    = GetDlgItemInt(hDlg, IDC_START_MS, NULL, FALSE);
  915.                 dopt->video.lEndOffsetMS    = GetDlgItemInt(hDlg, IDC_END_MS, NULL, FALSE);
  916.                 dopt->audio.fStartAudio        = !!IsDlgButtonChecked(hDlg, IDC_OFFSET_AUDIO);
  917.                 dopt->audio.fEndAudio        = !!IsDlgButtonChecked(hDlg, IDC_CLIP_AUDIO);
  918.                 EndDialog(hDlg, TRUE);
  919.                 return TRUE;
  920.             case IDCANCEL:
  921.                 EndDialog(hDlg, FALSE);
  922.                 return TRUE;
  923.             }
  924.             break;
  925.     }
  926.     return FALSE;
  927. }
  928.  
  929. BOOL APIENTRY AudioVolumeDlgProc( HWND hdlg, UINT message, UINT wParam, LONG lParam)
  930. {
  931.     DubOptions *dopt = (DubOptions *)GetWindowLong(hdlg, DWL_USER);
  932.     static const double log2 = 0.69314718055994530941723212145818;
  933.  
  934.     switch (message)
  935.     {
  936.         case WM_INITDIALOG:
  937.             SetWindowLong(hdlg, DWL_USER, lParam);
  938.             dopt = (DubOptions *)lParam;
  939.  
  940.             {
  941.                 HWND hwndSlider = GetDlgItem(hdlg, IDC_SLIDER_VOLUME);
  942.  
  943.                 SendMessage(hwndSlider, TBM_SETRANGE, TRUE, MAKELONG(0, 65));
  944.  
  945.                 if (dopt->audio.volume) {
  946.                     CheckDlgButton(hdlg, IDC_ADJUSTVOL, BST_CHECKED);
  947.  
  948.                     SendMessage(hwndSlider, TBM_SETPOS, TRUE, (int)(32.5 - 80.0 + log(dopt->audio.volume)/(log2/10.0)));
  949.  
  950.                     AudioVolumeDlgProc(hdlg, WM_HSCROLL, 0, (LPARAM)hwndSlider);
  951.                 } else {
  952.                     SendMessage(hwndSlider, TBM_SETPOS, TRUE, 32);
  953.                     EnableWindow(GetDlgItem(hdlg, IDC_SLIDER_VOLUME), FALSE);
  954.                     EnableWindow(GetDlgItem(hdlg, IDC_STATIC_VOLUME), FALSE);
  955.                 }
  956.             }
  957.             return (TRUE);
  958.  
  959.         case WM_HELP:
  960.             {
  961.                 HELPINFO *lphi = (HELPINFO *)lParam;
  962.  
  963.                 if (lphi->iContextType == HELPINFO_WINDOW)
  964.                     HelpPopupByID(hdlg, lphi->iCtrlId, dwVideoClippingHelpLookup);
  965.             }
  966.             return TRUE;
  967.  
  968.         case WM_COMMAND:
  969.             switch(LOWORD(wParam)) {
  970.             case IDOK:
  971.                 if (IsDlgButtonChecked(hdlg, IDC_ADJUSTVOL)) {
  972.                     int pos = SendDlgItemMessage(hdlg, IDC_SLIDER_VOLUME, TBM_GETPOS, 0, 0);
  973.  
  974.                     dopt->audio.volume = (int)(0.5 + 256.0 * pow(2.0, (pos-32)/10.0));
  975.                 } else
  976.                     dopt->audio.volume = 0;
  977.  
  978.                 EndDialog(hdlg, TRUE);
  979.                 return TRUE;
  980.             case IDCANCEL:
  981.                 EndDialog(hdlg, FALSE);
  982.                 return TRUE;
  983.  
  984.             case IDC_ADJUSTVOL:
  985.                 if (HIWORD(wParam)==BN_CLICKED) {
  986.                     BOOL f = !!IsDlgButtonChecked(hdlg, IDC_ADJUSTVOL);
  987.  
  988.                     EnableWindow(GetDlgItem(hdlg, IDC_SLIDER_VOLUME), f);
  989.                     EnableWindow(GetDlgItem(hdlg, IDC_STATIC_VOLUME), f);
  990.                 }
  991.                 return TRUE;
  992.             }
  993.             break;
  994.  
  995.         case WM_HSCROLL:
  996.             if (lParam) {
  997.                 char buf[64];
  998.                 int pos = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
  999.  
  1000.                 sprintf(buf, "%d%%", (int)(0.5 + 100.0*pow(2.0, (pos-32)/10.0)));
  1001.                 SetDlgItemText(hdlg, IDC_STATIC_VOLUME, buf);
  1002.             }
  1003.             break;
  1004.     }
  1005.     return FALSE;
  1006. }
  1007.  
  1008. BOOL CALLBACK VideoJumpDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  1009.     char buf[32];
  1010.  
  1011.     switch(msg) {
  1012.     case WM_INITDIALOG:
  1013.         {
  1014.             long ticks = inputVideoAVI->samplesToMs(lParam);
  1015.             long ms, sec, min;
  1016.  
  1017.             CheckDlgButton(hdlg, IDC_JUMPTOFRAME, BST_CHECKED);
  1018.             SendDlgItemMessage(hdlg, IDC_FRAMETIME, EM_LIMITTEXT, 30, 0);
  1019.             SetDlgItemInt(hdlg, IDC_FRAMENUMBER, lParam, FALSE);
  1020.             SetFocus(GetDlgItem(hdlg, IDC_FRAMENUMBER));
  1021.             SendDlgItemMessage(hdlg, IDC_FRAMENUMBER, EM_SETSEL, 0, -1);
  1022.  
  1023.             ms  = ticks %1000; ticks /= 1000;
  1024.             sec    = ticks %  60; ticks /=  60;
  1025.             min    = ticks %  60; ticks /=  60;
  1026.  
  1027.             if (ticks)
  1028.                 wsprintf(buf, "%d:%02d:%02d.%03d", ticks, min, sec, ms);
  1029.             else
  1030.                 wsprintf(buf, "%d:%02d.%03d", min, sec, ms);
  1031.  
  1032.             SetDlgItemText(hdlg, IDC_FRAMETIME, buf);
  1033.         }
  1034.         return FALSE;
  1035.  
  1036.     case WM_COMMAND:
  1037.         switch(LOWORD(wParam)) {
  1038.         case IDCANCEL:
  1039.             EndDialog(hdlg, -1);
  1040.             break;
  1041.         case IDOK:
  1042.             if (IsDlgButtonChecked(hdlg, IDC_JUMPTOFRAME)) {
  1043.                 BOOL fOk;
  1044.                 UINT uiFrame = GetDlgItemInt(hdlg, IDC_FRAMENUMBER, &fOk, FALSE);
  1045.  
  1046.                 if (!fOk) {
  1047.                     SetFocus(GetDlgItem(hdlg, IDC_FRAMENUMBER));
  1048.                     MessageBeep(MB_ICONEXCLAMATION);
  1049.                     return TRUE;
  1050.                 }
  1051.  
  1052.                 EndDialog(hdlg, uiFrame);
  1053.             } else {
  1054.                 unsigned int hr, min, sec, ms=0;
  1055.                 int n;
  1056.  
  1057.                 GetDlgItemText(hdlg, IDC_FRAMETIME, buf, sizeof buf);
  1058.  
  1059.                 n = sscanf(buf, "%u:%u:%u.%u", &hr, &min, &sec, &ms);
  1060.  
  1061.                 if (n < 3) {
  1062.                     hr = 0;
  1063.                     n = sscanf(buf, "%u:%u.%u", &min, &sec, &ms);
  1064.                 }
  1065.  
  1066.                 if (n < 2) {
  1067.                     min = 0;
  1068.                     n = sscanf(buf, "%u.%u", &sec, &ms);
  1069.                 }
  1070.  
  1071.                 if (n < 1) {
  1072.                     SetFocus(GetDlgItem(hdlg, IDC_FRAMETIME));
  1073.                     MessageBeep(MB_ICONEXCLAMATION);
  1074.                     return TRUE;
  1075.                 }
  1076.  
  1077.                 while(ms > 1000)
  1078.                     ms /= 10;
  1079.  
  1080.                 EndDialog(hdlg, inputVideoAVI->msToSamples(ms+sec*1000+min*60000+hr*3600000));
  1081.             }
  1082.             break;
  1083.         case IDC_FRAMENUMBER:
  1084.             if (HIWORD(wParam) == EN_CHANGE) {
  1085.                 CheckDlgButton(hdlg, IDC_JUMPTOFRAME, BST_CHECKED);
  1086.                 CheckDlgButton(hdlg, IDC_JUMPTOTIME, BST_UNCHECKED);
  1087.             }
  1088.             break;
  1089.         case IDC_FRAMETIME:
  1090.             if (HIWORD(wParam) == EN_CHANGE) {
  1091.                 CheckDlgButton(hdlg, IDC_JUMPTOFRAME, BST_UNCHECKED);
  1092.                 CheckDlgButton(hdlg, IDC_JUMPTOTIME, BST_CHECKED);
  1093.             }
  1094.             break;
  1095.         }
  1096.         return TRUE;
  1097.     }
  1098.     return FALSE;
  1099. }
  1100.